ドキュメント内目次

  1. はじめに
  2. 本ドキュメントは,UV-Cプロジェクトのソフトウェアの開発完了報告について記述したものである。

  3. プログラム評価(Raspberry Pi)
  4. 本プロジェクトで作成,変更したプログラムの試験結果とそれに対する評価を以下に示す.また,本プロジェクトで実際に使用したプログラムは,mirs_mainにあがっている.また,mirs_mainからもダウンロードできる.

    以下に本プロジェクトで用いたプログラムのファイル構成を示す.

    2.1 机検知モジュールとそれに付随するプログラム

    1 camera.py

    opencvを用いて接続されたWebカメラから画像の取得するプログラム.取得した画像は ./images/captured.pngで保存される.

    実際に保存された画像を以下に示す.

    2 ssd_model.py

    Raspberry Piが起動されてから初めてメインプログラムが実行されるときに物体検知モデルを読み込み,メイン関数から渡された画像(1に示してあるもの)を学習済みの物体検知モデルによって,自作の机が画像のどの位置にあるのかをピクセルの座標で示す.それらの情報を元に元の画像上に物体を囲う矩形のボックスを描く(以降バインディングボックス).また,それぞれの情報を一つのオブジェクトにまとめてメイン関数に返す.

    以下に実際に物体検知をして取得された情報を示す.

    それぞれの値は、labelが検知された物体がなんなのかを,position(x,y)が検知された物体のバインディングボックスの左上の座標を,widthはバインディングボックスの横幅,heightはバインディングボックスの縦幅をそれぞれ示している.

    以下にバインディングボックスが描画された画像の様子を示す.

    期待した動作が行われていることが確認できた.

    3 object_detect/train.py

    物体検知のモデルの学習を行うプログラム.作成したAnnotationデータと画像を元に学習をする.

    これによって作成された学習済みモデルのパラメータファイルを以下に示す.

    DESK.pth

    期待した動作が行われていることが確認できた.

    4 Make_Datasets/camera_test.py

    物体検知モデルの学習用に画像を連続してとる関数が記述されている.

    期待した動作が行われていることが確認できた.

    5 Make_Datasets/select_datasets.py

    4のプログラムにより撮影された画像をランダムに選んで学習ようのデータとテストようのデータに分けるプログラム.

    それぞれランダムに抽出された画像はスクリプトから入力されたファイル名でスクリプトから指定された数だけ抽出された上で保存される.

    これによって実際に作られたファイルを以下に示す.

    train.txt

    期待した動作が行われていることが確認できた.

    2.2 走行ルート作成モジュールとそれに付随するプログラム

    1 calc.py

    メイン関数から取得した画像の中のバインディングボックスの横幅のピクセル値と中心のずれのピクセル値を渡されて機体とその相対位置を計算するモジュール.それぞれcalc_dist(width)とcalc_devi(width,devi)の関数で記述されている.戻り値はそれぞれ浮動小数点型で,計算には以降で示すapproximate.jpynbによって計算された決定係数を用いた二次関数を用いている.

    実際に動作させた結果を以下に示す.

    上の数値のdistは机と機体との距離,deviは機体の中心と机の中心とのずれである.単位はいずれも[cm]であり,それぞれの値はcalc_dist(width)と,calc_devi(width,devi)の戻り値である.

    期待した動作が行われていることが確認できた.

    2 route.py

    calc.pyで取得したdistとdeviを元に走行ルートを作成するプログラムである.計算には三角関数を用いており,計算された結果を以降に示すArduinoモジュールを用いてArduinoに送信している.その際にorderモジュールを通して命令文形式にエンコードしている.また,Arduinoに命令を送信し,Arduinoが操作している最中に追加で命令が送られないように走行距離(回転角度)を走行速度(回転速度)で割った時間に0.5秒を足した数を引数にし,その秒数だけメイン関数でスリープさせる.

    期待した動作が行われていることが確認できた.

    3 make_distance_datasets_ras.py

    机と機体との距離を計測するのに必要なデータを集めるプログラム.写真を10cm間隔で5枚ずつ画像を取得し,それぞれの距離でのバインディングボックスの横幅のデータを得るために開発した.

    次に示す決定係数の計算に用いるデータを作成する.

    期待した動作が行われていることが確認できた.

    4 Make_Datasets/approximate.jpynb

    開発当初は物体との距離をカメラの画角,実際の机のサイズ等から計算しようとしがそれよりもバインディングボックスの横幅と実際の距離のデータを近似し,その関数に取得したピクセルデータを当てはめた方が簡単だと気づいたため開発した.

    机が見る角度によってサイズが大きく見えるため,正面から外れると誤差が出るが精度は及第点であると判断した.

    近似した関数の決定係数は./data/ObjectDistanceDatas.csvというファイルに保存される.

    実際に取得したデータから計算された決定係数を格納したファイルを以下に示す.

    Determination_factors.csv

    2.3 自己位置確認モジュール

    1 position.py

    いくつの机を消毒するのかを決めるプログラム.メイン関数でこれを呼び出すことで残りいくつの机を消毒すればいいのかを判断する.

    期待した動作が行われていることが確認できた.

    2.4 Arduino通信プログラム

    1 arduino.py

    pythonのモジュールであるpyserialモジュールのserial.Serialクラスを親クラスとして新規モジュールを追加したmy_serialを記述しているプログラム.既存の通信クラスに自作のモジュールを追加して,送信したらArduinoからのレスポンスを確認するモジュール,プログラム終了時に自動でシリアル通信を終了するプログラムを追加した.

    実際に通信している様子を以下に示す.

    期待した動作が行われていることが確認できた.

    2 order.py

    引数として渡された情報をArduinoに送信する形式に変換するプログラム.何を制御するのかとそれをどれくらい動かすのか(制御値)を示した命令文に直す.

    実際に命令分の形式にエンコードされたものを以下に示す.

    期待した動作が行われていることが確認できた.

  5. プログラム評価(Arduino)
  6. 実際に用いたプログラムのうち,独自で開発したものについて評価する.

    1 serial_com.ino

    Raspberry Piとのシリアル通信を行うモジュール.本モジュールではRaspberry Piから送られた命令文をデコードし,直進,回転,LEDの点灯制御を行う.

    実際の動作では送られた命令通りに動作していることが確認できた.

  7. 発生した問題とその解決
  8. 本プロジェクトの後半でArduinoとRaspberry Piが通信を行わないという問題が発生した.具体的には,シリアル通信を行いたいのだが文字を送るのが非常に遅いというものだった.この問題の影響で長い間パソコンとArduinoを繋いだ状態で実行テストを行なっていた.

    解決方法としては,最も簡単な通信プログラム(RaspberryPiからaを送って送られてきたらモータを回すだけなど)からテストをし直してプログラムを1から書き直した.また,VNCを使用してArduinoのシリアルモニタをリアルタイムで監視しながら実行したところ問題なく動作した.

    具体的になにが問題だったのかはわからないということが問題ではあるが最終的には動いた.

  9. 総括
  10. 本プロジェクトの一番コアとなる機能は,次に消毒する机を認識して自動でその机に向かっていくという機能だ.その機能については及第点を得たと思う.また,開発の進捗に関してもかなり早い段階で形にはなっていた.

    また,自立走行の機能を実装するためにかなり付随のプログラムを書いたり,実際にデータを取ってそれの解析を簡単にだが行ったりと,機能実装以外のプログラムがかなり大変なプロジェクトであった.

    当初目標としていた天板の昇降機能のついた机の消毒ロボットは完成しなかったが,先ほども述べた通り核となる自立走行機能はかなりの精度で実装できたのでかなり満足いく結果となった.

    ただ,開発の後半で原因不明の不具合が発生して開発が一時中断したことがあった.その時にもっとさまざまなアプローチをかけていればもっとスムーズな開発が行えていたと思う.

    また,初期の設計の段階でモジュールごとの開発担当が曖昧だったため,ソフト担当が3人いたにもかかわらず,1.5人分くらいの処理能力しかなかったのが問題だった.つぎに開発を行う時はもっと開発担当をはっきりさせた上でマンパワーを潤沢に使って開発に臨みたい.

  11. メカ
  12. エレキ